iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Software Development

超簡單的 Verilog 入門講解系列 第 29

[Day 29] Verilog E-1 難度丁 P2海域的斬殺4 - Rs232訊號協議 TB設計4(設計右移)

  • 分享至 

  • xImage
  •  

一樣昨天的 TB 繼續

module tb1();

//Data_tb1改為Wire
Wire Data_tb1;
reg clk_tb1;
reg reset_tb1;
        
reg[27:0] Data_Test_input;


assign Data_tb1 = Data_Test_input[0];

Wire[7:0] Out_tb1;
Wire En_out_tb1;

Rs232_test1 Rs232_test_tb1(
    .Data1(Data_tb1),.clk(clk_tb1),.reset1(reset_tb1),
    .Out1(Out_tb1),.En_out(En_out_tb1)
    );
    
    
    
initial begin

Data_tb1<=0; clk_tb1<=0; reset_tb1<=0;

//初始化Data_Test_input
Data_Test_input<={1'b1,8'b11110000, 1'b0,2'b01,16'hffff};


end


always #5 clk_tb1<=~clk_tb1;


always@(posedge clk_tb1) begin
    
    
    if( Count_Test >= 287 ) begin
         Count_Test<=0;
    end
    else begin
         Count_Test <= Count_Test + 1 ;
    end
    
    if( Count_Test == 0 ) begin

       ?????????? 
       
    end
    
end

endmodule

昨天我們已經設計完 Data_Test_input,那我們接下來就要寫如何右移

也就是將

  1. Data_Test_input[0]送出去之後
  2. 將 Data_Test_input[1] 推到 Data_Test_input[0]
  3. 依此類推 將 Data_Test_input[N+1] 推到 Data_Test_input[N]
  4. 再將 Data_Test_input[0] 推到 Data_Test_input[最後一位]
  5. 再將新的 Data_Test_input[0]送出去之後

我們用數據來看就是
Data_Test_input<={8'b11110000, 1'b0,2'b01,15'hffff, 1'b1};

1.將 Data_Test_input[0]送出去 就是將第0位的 {8'b11110000, 1'b0,2'b01,15'hffff, 1'b1} 送出去
2.然後右移 {8'b11110000, 1'b0,2'b01,15'hffff}
3.將 剛剛送出去的 1'b1 移到 最左邊{1'b1 ,8'b11110000, 1'b0,2'b01,15'hffff}

那我們來設計:
昨天已經把Data_Test_input設計好了,那就將之前的Count_Test初始化

  1. Count_Test 設計為 Reg ,大小就是 288以上

  2. Count_Test初始化

  3. 將 Data_Test_input[N+1] 推到 Data_Test_input[N]

  4. 將 Data_Test_input[0] 推到 Data_Test_input[最後一位]

  5. Count_Test 設計為 Reg ,大小就是 288以上

    
reg[27:0] Data_Test_input;

// Count_Test 設計為 Reg ,大小就是 288以上
reg[10:0] Count_Test;

assign Data_tb1 = Data_Test_input[0];

Wire[7:0] Out_tb1;
Wire En_out_tb1;

Rs232_test1 Rs232_test_tb1(
    .Data1(Data_tb1),.clk(clk_tb1),.reset1(reset_tb1),
    .Out1(Out_tb1),.En_out(En_out_tb1)
    );
    
    
    
initial begin

Data_tb1<=0; clk_tb1<=0; reset_tb1<=0;

Data_Test_input<={1'b1,8'b11110000, 1'b0,2'b01,16'hffff};


end


  1. Count_Test初始化
    
reg[27:0] Data_Test_input;

// Count_Test 設計為 Reg ,大小就是 288以上
reg[10:0] Count_Test;

assign Data_tb1 = Data_Test_input[0];

Wire[7:0] Out_tb1;
Wire En_out_tb1;

Rs232_test1 Rs232_test_tb1(
    .Data1(Data_tb1),.clk(clk_tb1),.reset1(reset_tb1),
    .Out1(Out_tb1),.En_out(En_out_tb1)
    );
    
    
    
initial begin

Data_tb1<=0; clk_tb1<=0; reset_tb1<=0;

Data_Test_input<={1'b1,8'b11110000, 1'b0,2'b01,16'hffff};

//  Count_Test初始化
Count_Test<=0;
end


  1. 將 Data_Test_input[N+1] 推到 Data_Test_input[N]

reg[27:0] Data_Test_input 就 28個值,所以就是最高的不要動

1 推到 0 、 2 推到 1 ............ 27 推到 26

always@(posedge clk_tb1) begin
    
    
    if( Count_Test >= 287 ) begin
         Count_Test<=0;
    end
    else begin
         Count_Test <= Count_Test + 1 ;
    end
    
    if( Count_Test == 0 ) begin
        
        // 將 Data_Test_input[N+1] 推到 Data_Test_input[N]
        Data_Test_input[26:0]<=Data_Test_input[27:1];
       
       
    end
    
end

endmodule
  1. 將 Data_Test_input[0] 推到 Data_Test_input[最後一位]
    最後一位是 Data_Test_input[27]
always@(posedge clk_tb1) begin
    
    
    if( Count_Test >= 287 ) begin
         Count_Test<=0;
    end
    else begin
         Count_Test <= Count_Test + 1 ;
    end
    
    if( Count_Test == 0 ) begin
        
        
        Data_Test_input[26:0]<=Data_Test_input[27:1];
        
        // 將 Data_Test_input[0] 推到 Data_Test_input[最後一位]
       Data_Test_input[27]<=Data_Test_input[0];
       
    end
    
end

endmodule

這樣就完成了 TB了


上一篇
[Day 28] Verilog E-1 難度丁 P2海域的斬殺3 - Rs232訊號協議 TB設計3(初始化輸入數據)
下一篇
[Day 30] Verilog E-1 難度丁 - P2 結尾
系列文
超簡單的 Verilog 入門講解30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言